import { ArgumentMetadata, Injectable, PipeTransform } from "@nestjs/common";

/**
 * 通用可选管道工厂函数，将内置管道（如 ParseIntPipe）增强为支持可选校验的新管道。
 * @param OriginalPipe 需要增强的内置管道（如 ParseIntPipe）
 * @param options 不定量参数，原本是传入内置管道的参数，如 ParseIntPipe 的 options
 * @returns 支持可选校验的新管道
 * @description 内置管道默认要求前端参数是必传的，然后再进行类型检测和转换。增强点：当前端参数存在时才进行校验，不存在时则忽略，也就是让前端参数可选了。
 */
export function OptionalPipeFactory<T extends PipeTransform>(
    OriginalPipe: new (...args: any[]) => T,
    ...options: ConstructorParameters<typeof OriginalPipe>
): PipeTransform {
    @Injectable()
    class EnhancedPipe implements PipeTransform {
        private readonly originalPipe = new OriginalPipe(...options);

        transform(value: any, metadata: ArgumentMetadata) {
            if (value === undefined || value === null || value === "") {
                return undefined;
            }
            return this.originalPipe.transform(value, metadata);
        }
    }

    return new EnhancedPipe();
}
